package main

import (
	"fmt"
	"github.com/codegangsta/inject"
	/*
		GO的命令go get让我们可以方便快捷的从网络中下载或更新Go语言包及其依赖文件，并将他们编译和安装。
			例如：go get github.com/codegangsta/inject
	*/)

type S1 interface{}

type S2 interface {
}

func Format(name string, company S1, level S2, age int) {
	fmt.Printf("name=%s, company=%s, level=%s, age=%d\n", name, company, level, age)
}

func main() {
	/*
		整个 inject 包的处理流程：
		（1）通过 inject.New() 创建注入引擎，注入引擎被隐藏，返回的是 Injector 接口类型变量
		（2）调用 TypeMapper 接口（Injector 内嵌 TypeMapper）的方法注入 struct 字段值或函数的实参值
		（3）调用 Invoker 方法执行被注入的函数，或者调用 Applicator 接口的方法获得被注入后的实参值
	*/

	//inject包借助反射实现函数的注入调用

	//控制实例的创建
	inj := inject.New()

	//实参注入
	inj.Map("tom")
	inj.MapTo("tencent", (*S1)(nil))
	inj.MapTo("T4", (*S2)(nil))
	inj.Map(23)

	//函数反转调用
	inj.Invoke(Format) //name=tom, company=tencent, level=T4, age=23
}
